from django.shortcuts import render
from django.http import HttpResponse,JsonResponse
from django.urls import reverse
from ..models import Type
## 数据进行复杂的查询
from django.db.models import Q
## 数据分页
from django.core.paginator import Paginator



# 商品分类展示
def types_list(request):
	# 查询
	types = request.GET.get('types',None)
	keywords = request.GET.get('keywords',None)
	if types:
		if types == 'name':
			ob = Type.objects.filter(name__contains=keywords)
		if types == 'all':
			ob = Type.objects.filter(name__contains=keywords)
	# 将分类的数据按照大的类目进行排序
	# 如：衣服展示在服装下面，不管什么时候进行的添加
	# 可以按照路径加和id进行拼接以后排序
	# select *，concat(path,id) paths from myadmin_type order by paths;
	# 上面的sql语句在模型中等价于：ob = Type.objects.extra(select = {'pahts':'concat(path,id)'}).order_by('paths')  
	else:
		ob = Type.objects.extra(select = {'paths':'concat(path,id)'}).order_by('paths')
	# pid的显示不能为数字并且类名的显示应该有缩进
	for i in ob:
		## 用路径中的','来控制缩进;低的一级缩进4个空格
		n = i.path.count(',') - 1 
		i.add = n * ('|---')
		# pid不是0，缩进并且获取到父级的名字
		if i.pid == 0:
			i.pname = '顶级分类'
		else:
			obj = Type.objects.get(id=i.pid)
			i.pname = obj.name
	# 进行分页：
	paginator = Paginator(ob,10)
	# 获取当前页码
	p = request.GET.get('p',1)
	# 获取分页数据对象
	data = paginator.page(p)
	content = {'data':data}
	return render(request,'myadmin/type/list.html',content)


# 商品分类添加
def types_add(request):
	if request.method == 'GET':
		## 将分类按照一定的顺序排下来
		ob = Type.objects.extra(select = {'paths':'concat(path,id)'}).order_by('paths')
		content = {'data':ob}
		return render(request,'myadmin/type/add.html',content)
	if request.method == 'POST':
		data = request.POST.dict()
		try:
			ob = Type()
			ob.name = data['name']
			ob.pid = data['pid']
			## 当pid=0时，为顶级分类，路径为0,
			## 当pid！=0时,路径为它的父级的id+,
			## 判断pid的情况
			if ob.pid == '0':
				ob.path = '0,'
			else:
				# 先获取其父级的id
				p = Type.objects.get(id=ob.pid).path
				# 其路径为父级路径加上它的id
				ob.path = f'{p}{ob.pid},'
			ob.save()
			url = reverse('types_list')
			return HttpResponse(f'<script>alert("添加成功");location.href="{url}";</script>')
		except:
			pass
		url = reverse('types_add')
		return HttpResponse(f'<script>alert("添加失败");location.href="{url}";</script>')


# 编辑
def types_edit(request):
	try:
		## 能进行编辑修改的字段也就只有分类的名称
		## 接收ajax传过来的参数
		uid = request.GET.get('uid')
		newname = request.GET.get('newname')
		# uid为要进行修改的字段的id；newname为要进行修改的值
		# 更新
		Type.objects.filter(id=uid).update(**{'name':newname})
		return JsonResponse({"msg":"更新成功"})
	except:
		 return JsonResponse({'msg':'更新失败'})


# 删除
def types_del(request):
	## 不可以直接进行删除
	# 需要判断要删除的是否含有子类，如果有子类，不能删除
	# 如果要删除的子类下面有数据，不能删除
	# ob = Type.objects.get(id=uid)
	# ob.delete()
	# # 要删除的字段的id
	uid = request.GET.get('uid')
	print('uid:',uid)
	# 要删除的信息下面含有子类；即存在pid=要删除的字段的id
	num = Type.objects.filter(pid=uid).count()
	## 如果num有值，则有子类
	if num:
		# 有子类
		return JsonResponse({'msg':'存在子类，不能执行删除','code':'1'})
	else:
		# 有商品信息，不能删除
		# 无商品信息，可以执行删除
		ob = Type.objects.get(id=uid)
		ob.delete()
		return JsonResponse({'msg':'删除成功','code':'0'})